var board = new Array();
// 分数
var score = 0;
// 是否产生碰撞，防止2 2 4 8 = 16的连续合并的发生，使用数组给每个格子设置标志位
var hasConflicted = new Array();

// 文档加载完之后运行主函数
$(document).ready(function() {
	newgame();
});

function newgame() {
	// 初始化棋盘格
	init();
	// 在随机两个格子生成数字
	// 在随机两个格子生成数字
	generateOneNumber();
	generateOneNumber();
}

function init() {
	// 初始化16个格子的位置
	for ( var i = 0; i < 4; i++)
		for ( var j = 0; j < 4; j++) {
			// $("#")是指选择器选择带有id的元素
			var gridCell = $('#grid-cell-' + i + "-" + j);
			gridCell.css('top', getPosTop(i, j));
			gridCell.css('left', getPosLeft(i, j));
		}
	// 将16个格子按行和列的方式，存进二维数组，初始化为0
	for ( var i = 0; i < 4; i++) {
		board[i] = new Array();
		hasConflicted[i] = new Array();
		for ( var j = 0; j < 4; j++) {
			board[i][j] = 0;
			hasConflicted[i][j] = false;
		}
	}

	updateBoardView();
	score = 0;
}

// 更新面板视图
function updateBoardView() {

	$(".number-cell").remove();
	// 将已存在的数字cell清除
	for ( var i = 0; i < 4; i++)
		for ( var j = 0; j < 4; j++) {
			// 遍历每个格子作为数字cell，生成div置于container内
			$("#grid-container").append(
					'<div class="number-cell" id="number-cell-' + i + '-' + j
							+ '"></div>');
			// 获取当前number-cell
			var theNumberCell = $('#number-cell-' + i + '-' + j);
			// 判断数组中与格子对应坐标的数字是否为0，如果是的话设置样式，使其不再页面上显示
			if (board[i][j] == 0) {
				theNumberCell.css('width', '0px');
				theNumberCell.css('height', '0px');
				theNumberCell.css('top', getPosTop(i, j) + 50);
				theNumberCell.css('left', getPosLeft(i, j) + 50);
			}
			// 如果不等于0的话，生成并在页面上显示格子，
			else {
				theNumberCell.css('width', '100px');
				theNumberCell.css('height', '100px');
				// 格子长宽各100px
				theNumberCell.css('top', getPosTop(i, j));
				theNumberCell.css('left', getPosLeft(i, j));
				// 通过i，j进行格子定位
				theNumberCell.css('background-color',
						getNumberBackgroundColor(board[i][j]));
				// 设置格子的北京颜色
				theNumberCell.css('color', getNumberColor(board[i][j]));
				// 设置将要显示的数字颜色
				theNumberCell.text(board[i][j]);
				// 将已设置好样式的格子先是到面板上去
			}
			hasConflicted[i][j] = false;
		}
}

// 随机位置生成一个数字
function generateOneNumber() {

	// 返回true表示没有空位，则不随机位置生成数字
	if (nospace(board))
		return false;

	// 随机一个位置，4*4，0-3，取地板
	var randx = parseInt(Math.floor(Math.random() * 4));
	var randy = parseInt(Math.floor(Math.random() * 4));

	// 判断随机出来的位置上是否已经有数，
	// 如果是0，表示位置是空的，这一组坐标有效
	// 若不为0，表示位置上已经有数字，这一组坐标无效，需要重新随机一组坐标
	while (true) {
		if (board[randx][randy] == 0)
			break;

		randx = parseInt(Math.floor(Math.random() * 4));
		randy = parseInt(Math.floor(Math.random() * 4));
	}

	// 随机一个数字，2或4，50%的概率
	var randNumber = Math.random() < 0.5 ? 2 : 4;

	// 在随机位置显示随机数字
	board[randx][randy] = randNumber;
	// 在面板上显示数字，刷新页面
	showNumberWithAnimation(randx, randy, randNumber);

	return true;
}

// 添加事件响应，上下左右键之外，除了进行移动，还需要随机生成一个位置的数
$(document).keydown(function(event) {
	switch (event.keyCode) {
	case 37:
		// left
		if (moveLeft()) {
			setTimeout("generateOneNumber()", 210);
			setTimeout("isGameOver()", 300);
		}
		break;
	case 38:
		// up
		if (moveUp()) {
			setTimeout("generateOneNumber()", 210);
			setTimeout("isGameOver()", 300);
		}
		break;
	case 39:

		// right
		if (moveRight()) {
			setTimeout("generateOneNumber()", 210);
			setTimeout("isGameOver()", 300);
		}

		break;
	case 40:
		// down
		if (moveDown()) {
			setTimeout("generateOneNumber()", 210);
			setTimeout("isGameOver()", 300);
		}
		break;
	default:
		break;
	}
});

// 左移
function moveLeft() {
	// 判定是否可以左移
	if (!canMoveLeft(board))
		return false;
	//
	for ( var i = 0; i < 4; i++) {
		// 从第二列开始比较，第一列无法左移
		for ( var j = 1; j < 4; j++) {
			// 当前位置有数
			if (board[i][j] != 0) {
				// 遍历当前位置同行中在当前位置前面的数，比较是否可以移动以及是否需要进行合并
				for ( var k = 0; k < j; k++) {
					if (board[i][k] == 0 && noBlockHorizontal(i, k, j, board)) {
						// move
						showMoveAnimation(i, j, i, k);
						board[i][k] = board[i][j];
						board[i][j] = 0;
						continue;
					} else if (board[i][k] == board[i][j]
							&& noBlockHorizontal(i, k, j, board)
							&& !hasConflicted[i][k]) {
						// move
						showMoveAnimation(i, j, i, k);
						// add
						board[i][k] += board[i][j];
						board[i][j] = 0;
						// add score
						score += board[i][k];
						updateScore(score);
						hasConflicted[i][k] = true;
						continue;
					}
				}
			}
		}
	}
	// 重置页面，刷新
	setTimeout("updateBoardView()", 200);
	return true;
}

// 上移
function moveUp() {
	// 判定是否可以上移
	if (!canMoveUp(board))
		return false;
	//
	for ( var j = 0; j < 4; j++) {// 列
		// 从第二行开始比较，第一列无法上移
		for ( var i = 1; i < 4; i++) {// 行
			// 当前位置有数,第i行第j列
			if (board[i][j] != 0) {
				// 遍历当前位置同行中在当前位置上面的数，比较是否可以移动以及是否需要进行合并
				for ( var k = 0; k < i; k++) {
					if (board[k][j] == 0 && noBlockHorizontal01(j, k, i, board)) {
						// move
						showMoveAnimation(i, j, k, j);
						board[k][j] = board[i][j];
						board[i][j] = 0;
						continue;
					} else if (board[k][j] == board[i][j]
							&& noBlockHorizontal01(j, k, i, board)
							&& !hasConflicted[k][j]) {
						// move
						showMoveAnimation(i, j, k, j);
						// add
						board[k][j] += board[i][j];
						board[i][j] = 0;
						// add score
						score += board[k][j];
						updateScore(score);
						hasConflicted[k][j] = true;
						continue;
					}
				}
			}
		}
	}
	// 重置页面
	setTimeout("updateBoardView()", 200);
	return true;
}
// 右移
function moveRight() {
	// 判定是否可以右移
	if (!canMoveRight(board))
		return false;
	//
	for ( var i = 0; i < 4; i++) {
		// 第4列无法右移
		for ( var j = 2; j >= 0; j--) {
			// 当前位置有数
			if (board[i][j] != 0) {
				// 遍历当前位置同行中在当前位置右边的数，比较是否可以移动以及是否需要进行合并
				for ( var k = 3; k > j; k--) {
					if (board[i][k] == 0 && noBlockHorizontal02(i, j, k, board)) {
						// move
						showMoveAnimation(i, j, i, k);
						board[i][k] = board[i][j];
						board[i][j] = 0;
						continue;
					} else if (board[i][k] == board[i][j]
							&& noBlockHorizontal02(i, j, k, board)
							&& !hasConflicted[i][k]) {
						// move
						showMoveAnimation(i, j, i, k);
						// add
						board[i][k] += board[i][j];
						board[i][j] = 0;
						// add score
						score += board[i][k];
						updateScore(score);
						hasConflicted[i][k] = true;
						continue;
					}
				}
			}
		}
	}
	// 重置页面
	setTimeout("updateBoardView()", 200);
	return true;
}
// 下移
function moveDown() {
	// 判定是否可以下移
	if (!canMoveDown(board))
		return false;
	//
	for ( var j = 0; j < 4; j++) {
		// 从第3行开始比较,第4行无法下移
		for ( var i = 2; i >= 0; i--) {
			// 当前位置有数
			if (board[i][j] != 0) {
				// 遍历当前位置同行中在当前位置下面的数，比较是否可以移动以及是否需要进行合并
				for ( var k = 3; k > i; k--) {
					if (board[k][j] == 0 && noBlockHorizontal03(j, i, k, board)) {
						// move
						showMoveAnimation(i, j, k, j);
						board[k][j] = board[i][j];
						board[i][j] = 0;
						continue;
					} else if (board[k][j] == board[i][j]
							&& noBlockHorizontal03(j, i, k, board)
							&& !hasConflicted[k][j]) {
						// move
						showMoveAnimation(i, j, k, j);
						// add
						board[k][j] += board[i][j];
						board[i][j] = 0;
						// add score
						score += board[k][j];
						updateScore(score);
						hasConflicted[k][j] = true;
						continue;
					}
				}
			}
		}
	}
	// 重置页面
	setTimeout("updateBoardView()", 200);
	return true;
}

// 判定游戏是否结束
// 表格中没有空白
// 表格中的数不能再进行上下左右的移动
function isGameOver() {
	if (nospace(board) && nomove(board)) {
		gameover();
	}
}

// 游戏结束
// 提交数据到后台，比较最高记录是否需要进行更新
function gameover() {
	document.getElementsByName("score")[0].value = score;
	document.text.submit();
	alert('gameover!');

}
